package com.zjl.学习.第07章_高级.C_分区步骤;

import org.springframework.batch.core.partition.support.Partitioner;
import org.springframework.batch.item.ExecutionContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * 默认的实现类：MultiResourcePartitioner
 *
 * Partitioner 接口只有唯一的方法：
 *      partition 参数gridSize表示要分区的大小，可以理解为要开启多个worker步骤，返回值是一个Map，
 *      其中key：worker步骤名称， value：worker步骤启动需要参数值，一般包含分区元数据，比如起始位置，数据量等。
 *
 */
public class C1_分区器 {

}
class MyPartitioner implements Partitioner {

    @Override//gridSize  表示你是第几个运行的分区
    public Map<String, ExecutionContext> partition(int gridSize) {
        Map<String, ExecutionContext> result = new HashMap<>(gridSize);

        int range = 10; //文件间隔
        int start = 1; //开始位置
        int end = 10;  //结束位置
        String text = "item/fq/user%s-%s.txt";

        for (int i = 0; i < gridSize; i++) {
            ExecutionContext value = new ExecutionContext();//上下文，就是某一个分区的指定数据
            String format = String.format(text, start, end);
            Resource resource = new ClassPathResource(format);//为每个分区放入数据
            try {
                value.putString("file", resource.getURL().toExternalForm());
                value.putString("fileName", format);
            } catch (IOException e) {
                e.printStackTrace();
            }
            start += range;
            end += range;

            result.put("user_partition_" + i, value);
        }
        return result;//分区个数，已此值的size 为准
    }
}